home *** CD-ROM | disk | FTP | other *** search
- #! /bin/sh
- # $Header: /home/jerry/.bin/RCS/xrefile,v 1.3 92/08/09 23:26:37 jerry mh_contrib $
- #
- ### xrefile - refile mail from current account to another
- ### Usage: xrefile -u other_username [msgs] [+remote-folder]
- ##
- ## LIKE refile, BUT COPIES MESSAGES TO OTHER ACCOUNT AND THEM rmm'S.
- ## NICER THAN dist BECAUSE IT PRESERVES THE ORIGINAL MESSAGE DATE
- ## AND ETC. NICER THAN forw BECAUSE THE ORIGINAL MESSAGE ISN'T
- ## BURIED INSIDE DASHED LINES, BECAUSE IT DOESN'T TRASH THE STARTS
- ## OF DASHED LINES IN THE ORIGINAL MESSAGE, AND BECAUSE pick CAN FIND
- ## THE ORIGINAL MESSAGE WITHOUT NEEDING TO USE -search.
- ##
- ## WATCH OUT: xrefile COPIES MESSAGES INTO A HIDDEN SUBDIRECTORY OF
- ## /tmp FOR LONG ENOUGH TO TRANSFER THEM. IF xrefile BOMBS BEFORE
- ## IT FINISHES, IT COULD LEAVE MESSAGES UNDER /tmp. (IT WON'T REMOVE
- ## THE MESSAGES FROM THE SOURCE FOLDER, THOUGH, UNTIL THEY'RE IN THE
- ## OTHER ACCOUNT'S FOLDER -- SO YOU WON'T LOSE MESSAGES IN A CRASH.)
- #
- # NOTE TO HACKERS: TABSTOPS SET AT 4 IN THIS CODE
- #
- # USE AT YOUR OWN RISK. SEEMS TO WORK, BUT IT'S YOUR RESPONSIBILITY!
- # PLEASE TELL ME ABOUT BUGS AND FIXES: Jerry Peek, jerry@ora.com
-
- mh=/usr/local/mh # WHERE mh COMMANDS LIVE
- tmpdir=/tmp/.XFRDIR$$ # HIDDEN TEMPORARY DIRECTORY FOR MAIL TRANSFER
- tmpscr=/tmp/.XFRSCR$$ # HIDDEN TEMPORARY SHELL SCRIPT; COPIES MESSAGES
-
- stat=1 # ERROR EXIT STATUS (RESET TO 0 FOR NORMAL EXITS)
- trap 'rm -rf $tmpdir $tmpscr; exit $stat' 0 1 2 15
-
- myname="`basename $0`"
- usage="$myname -u other_username [msgs] [+remote-folder]"
-
- # PARSE COMMAND LINE:
- while :
- do
- case $# in
- 0) break ;;
- esac
-
- case "$1" in
- -u) case "$2" in
- "") echo "Usage: $usage
- (Missing user name after -u)" 1>&2
- exit
- ;;
- *) user="$2"
- shift # SHIFT OFF -u (WILL shift $2 AT END OF LOOP)
- ;;
- esac
- ;;
- +*) rmtfolder="$1" ;;
- *) msgs="$msgs $1" ;; # IT'S A MESSAGE (WE HOPE...)
- esac
-
- shift
- done
-
- case "$user" in
- "") echo "Usage: $usage
- (missing -u)" 1>&2
- exit
- ;;
- esac
-
- if mkdir $tmpdir
- then chmod 711 $tmpdir # OTHER ACCOUNT WILL KNOW EXACT FILENAMES
- else
- echo "${myname}: problem making '$tmpdir' directory. Quitting." 1>&2
- exit
- fi
-
- : ${msgs=cur} # IF NO MESSAGES GIVEN, USE cur
-
- # GO TO THE CURRENT FOLDER AND GET MESSAGE LIST.
- # DO THIS TO MAKE PATHNAMES SHORTER; AVOIDS TOO-LONG COMMAND LINES:
- srcfolder="`$mh/mhpath`" || {
- echo "${myname}: fatal: can't get current folder name?!?" 1>&2
- exit
- }
- cd "$srcfolder" || {
- echo "${myname}: fatal: 'cd $srcfolder' bombed." 1>&2
- exit
- }
- # GET LIST OF MESSAGES; LET cp COMPLAIN IF IT CAN'T READ THEM...
- # (WE CAN'T JUST USE $msgs BECAUSE IT MIGHT HAVE last:10, ETC.)
- # USE tr TO CHANGE NEWLINES TO SPACES SO $xfrscr DOESN'T BOMB:
- cpfrom="`$mh/mhpath $msgs | sed \"s@^$srcfolder/@@\" | tr '\012' ' '`" || {
- echo "${myname}: fatal: 'mhpath \$msgs | sed' bombed." 1>&2
- exit
- }
-
-
- # MAKE THE SHELL SCRIPT THAT $user'S ACCOUNT WILL USE. IT BOMBS (-e)
- # AND DOESN'T PUT MESSAGE IN $xfr_done FILE IF ANYTHING FAILS:
- echo "#! /bin/sh -e
- # FILE-COPYING SCRIPT MADE BY $USER
- cd $tmpdir
- for msg in $cpfrom
- do cp -i \$msg \`$mh/mhpath new $rmtfolder\`
- done
- # IF WE GET HERE, NOTHING BOMBED AND cp -i DIDN'T GET ANY n ANSWERS.
- # RETURN STATUS TO su SHELL (AND FROM THERE TO CALLING PROGRAM):
- exit 0" > $tmpscr
-
- chmod +x $tmpscr || exit
-
- # NOW THAT WE'VE GOT THE SCRIPT, COPY THE MESSAGES TO $tmpdir
- # (LEAVE THEM THERE AS SHORT A TIME AS WE CAN...)
- cp -i $cpfrom $tmpdir || {
- echo "${myname}: fatal: 'cp $cpfrom $tmpdir' bombed." 1>&2
- exit
- }
-
- cd $tmpdir # MUST BE HERE OR su BOMBS (IF MH directory PROTECTED)
- chmod 644 * || {
- echo "${myname}: fatal: 'chmod 644 *' bombed." 1>&2
- exit
- }
-
- # DO THE COPY (NOT ALL SYSTEMS LET YOU DO su -f TO A BOURNE SHELL!):
- echo -n "$user " # PUT USERNAME BEFORE Password:
- su $user -c $tmpscr
- case $? in
- 0) $mh/rmm $cpfrom
- stat=0
- ;;
- *) echo "$myname: Something went wrong with the copying...
- I won't remove the source messages." 1>&2 ;;
- esac
-
- exit
-